// app.js
const request = require('./libs/request.js')
const apiConfig = require('./config/api.js')
const auth = require('./utils/auth.js')

App({
  onLaunch() {

    // 初始化request配置
    this.initRequest()

    // 自动授权登录
    this.autoLogin()
  },

  // 初始化请求配置
  initRequest() {
    // 更新request配置
    request.updateConfig({
      baseURL: apiConfig.baseURL,
      timeout: 10000,
      autoAuth: true,
      authRetryCount: 1
    })

    console.log('Request配置已初始化:', {
      baseURL: apiConfig.baseURL
    })
  },

  // 自动授权登录
  async autoLogin() {
    try {
      // 显示加载提示
      wx.showLoading({
        title: '启动中...',
        mask: true
      })

      // 检查当前登录状态
      const loginStatus = await auth.checkLoginStatus()
      
      if (loginStatus.isLoggedIn) {
        // 用户已登录，直接完成
        wx.hideLoading()
        
        // 更新全局数据
        this.globalData.userInfo = loginStatus.userInfo
        this.globalData.isAutoLoginComplete = true
        this.globalData.loginStatus = loginStatus.status
        
        // 通知当前页面登录状态已更新
        this.notifyPageLoginStatus(true, loginStatus.userInfo)
        return
      }

      // 用户未登录，执行静默授权登录
      const loginResult = await auth.login()
      
      if (loginResult.success) {
        wx.hideLoading()
        
        // 更新全局数据
        this.globalData.userInfo = loginResult.userInfo
        this.globalData.isAutoLoginComplete = true
        this.globalData.loginStatus = 'logged_in'
        
        // 通知当前页面登录成功
        this.notifyPageLoginStatus(true, loginResult.userInfo)
      } else {
        throw new Error(loginResult.message)
      }
      
    } catch (error) {
      
      // 根据错误类型处理
      if (error.message.includes('网络') || error.message.includes('timeout')) {
        // 网络错误，延迟重试
        this.showRetryDialog('网络连接失败，是否重试？')
      } else if (error.message.includes('授权') || error.message.includes('登录')) {
        // 授权相关错误
        this.handleAuthError(error.message)
      } else {
        // 其他错误，显示错误提示
        wx.showToast({
          title: '登录失败，请重试',
          icon: 'error',
          duration: 2000
        })
        
        // 延迟重试
        setTimeout(() => {
          this.retryLogin()
        }, 3000)
      }
    }
  },

  // 处理授权错误
  handleAuthError(errorMessage) {
    // 清除可能损坏的登录数据
    auth.clearLocalUserData()
    
    // 更新全局状态
    this.globalData.userInfo = null
    this.globalData.isAutoLoginComplete = true
    this.globalData.loginStatus = 'auth_failed'
    
    // 通知页面登录失败
    this.notifyPageLoginStatus(false, null)
    
    wx.hideLoading()
    
    // 显示错误提示
    wx.showToast({
      title: '登录失败，请重试',
      icon: 'none',
      duration: 3000
    })
  },

  // 通知页面登录状态
  notifyPageLoginStatus(isLoggedIn, userInfo) {
    // 获取当前页面实例
    const pages = getCurrentPages()
    const currentPage = pages[pages.length - 1]
    
    if (currentPage && typeof currentPage.onAutoLoginComplete === 'function') {
      // 调用页面的自动登录完成回调
      currentPage.onAutoLoginComplete(isLoggedIn, userInfo)
    }
    
    // 也可以通过事件总线或其他方式通知页面
    console.log('已通知页面登录状态:', { isLoggedIn, userInfo })
  },

  // 显示重试对话框
  showRetryDialog(message) {
    wx.hideLoading()
    
    wx.showModal({
      title: '登录失败',
      content: message,
      confirmText: '重试',
      cancelText: '取消',
      success: (res) => {
        if (res.confirm) {
          this.retryLogin()
        } else {
          // 用户取消，可以跳转到登录页面或显示错误页面
          this.handleLoginFailure()
        }
      }
    })
  },

  // 处理登录失败
  handleLoginFailure() {
    // 更新全局状态
    this.globalData.isAutoLoginComplete = true
    this.globalData.loginStatus = 'failed'
    
    // 通知页面登录失败
    this.notifyPageLoginStatus(false, null)
    
    // 可以跳转到专门的登录页面或显示错误信息
    wx.showToast({
      title: '请检查网络后重试',
      icon: 'none',
      duration: 3000
    })
  },

  // 重试登录
  retryLogin() {
    console.log('重试登录...')
    // 限制重试次数
    if (!this.globalData.retryCount) {
      this.globalData.retryCount = 0
    }
    
    if (this.globalData.retryCount < 3) {
      this.globalData.retryCount++
      this.autoLogin()
    } else {
      // 超过重试次数，显示错误信息
      this.handleLoginFailure()
      this.globalData.retryCount = 0
    }
  },

  // 手动刷新登录状态
  async refreshLoginStatus() {
    try {
      const needReLogin = await auth.needReLogin()
      if (needReLogin) {
        console.log('检测到需要重新登录')
        this.autoLogin()
      }
    } catch (error) {
      console.error('刷新登录状态失败:', error)
    }
  },

  globalData: {
    userInfo: null,
    isAutoLoginComplete: false,
    loginStatus: 'pending', // pending, logged_in, logged_in_local, auth_failed, failed
    retryCount: 0
  }
})
